package com.zy.函数式编程.匿名函数

object Test {
  def main(args: Array[String]): Unit = {

    // 定义匿名函数，赋给变量并调用
    val fun1 = (name: String, age: Int) => println(s"你好,${age}岁的${name}!")
    fun1("张三", 18)

    println("==========================================")

    // 定义一个函数，以函数作为参数
    def fun2(name: String, fun: (String, Int) => Unit) = {
      fun(name, 0)
    }

    fun2("李四", fun1)

    println("==========================================")


    // 直接在函数变量中定义匿名函数时，函数的类型可以省略(一个参数的话括号也可以省略)
    fun2("王五", (name, age) => println(s"您好,${age}岁的${name}!"))

    println("==========================================")

    // 如果参数只出现一次，则可以使用 _ 代替
    def fun3(fun: Int => Unit) = {
      fun(1)
    }

    fun3(println(_))
    // 如果可以推断出传入的println是一个函数体，不是调用语句，则可以省略下划线
    fun3(println)

    println("==========================================")

    // 匿名函数简化
    def fun4(fun: (Int, Int) => Int): Int = fun(1, 2)

    println(fun4((a: Int, b: Int) => a + b))
    println(fun4((a, b) => a + b))
    println(fun4((a, b) => a + b))
    println(fun4(_ + _)) // a和b只出现了一次，所以可以使用下划线
  }
}
